home *** CD-ROM | disk | FTP | other *** search
/ Nothing but Tetris / Nothing but Tetris.iso / amiga / wbtris_1.54 / source / options.c < prev    next >
C/C++ Source or Header  |  1988-10-06  |  8KB  |  288 lines

  1. #include "WBTRIS.h"
  2.  
  3. #define GD_SLIDER   0
  4. #define GD_STRING   1
  5. #define GD_CYCLE    2
  6. #define GD_CHECK    3
  7. #define GD_SLIDER2  4
  8. #define GD_BUTTON1  5
  9. #define GD_BUTTON2  6
  10.  
  11. #define GDX_SLIDER  0
  12. #define GDX_STRING  1
  13. #define GDX_CYCLE   2
  14. #define GDX_CHECK   3
  15. #define GDX_SLIDER2 4
  16. #define GDX_BUTTON1 5
  17. #define GDX_BUTTON2 6
  18.  
  19. #define Options_CNT 7
  20.  
  21. struct Window         *OptionsWnd = NULL;
  22. struct Gadget         *OptionsGList = NULL;
  23. struct Gadget         *OptionsGadgets[7];
  24. UWORD                  OptionsLeft = 119;
  25. UWORD                  OptionsTop = 125;
  26. UWORD                  OptionsWidth;
  27. UWORD                  OptionsHeight;
  28. UBYTE                 *OptionsWdt = (UBYTE *)"WBTRIS Options";
  29. struct TextAttr       *Font = NULL;
  30. struct TextAttr        Attr;
  31. UWORD                  FontX, FontY;
  32. UWORD                  OffX, OffY;
  33.  
  34. extern struct Screen  *myscreen;
  35. extern APTR            VisualInfo;
  36. extern struct GfxBase *GfxBase;
  37. extern struct TextAttr helvetica13;
  38. extern struct TextAttr topaz8;
  39. extern BOOL            UseLace;
  40.  
  41. extern char            Name[25];
  42. extern BOOL            lockname;
  43. extern BOOL            nextteil;
  44. extern int             LevelOffset;
  45. extern int             pulldownticks;
  46.  
  47. struct EasyStruct myES = {
  48.     sizeof(struct EasyStruct),
  49.     0,
  50.     "WBTRIS INFO",
  51.     "%s Version %s\n\n⌐ 1993 by \n%s\n\nThis game is 'Cardware'!\nPlease read the manual for explanation.",
  52.     "OK",
  53. };
  54.  
  55. UBYTE *CYCLE0Labels[] = {
  56.     (UBYTE *)"Lock Name",
  57.     (UBYTE *)"Ask Name",
  58.     NULL };
  59.  
  60. UWORD OptionsGTypes[] = {
  61.     SLIDER_KIND,
  62.     STRING_KIND,
  63.     CYCLE_KIND,
  64.     CHECKBOX_KIND,
  65.     SLIDER_KIND,
  66.     BUTTON_KIND,
  67.     BUTTON_KIND
  68. };
  69.  
  70. struct NewGadget OptionsNGad[] = {
  71.      33,  25, 200, 17, (UBYTE *)"Startlevel", NULL, GD_SLIDER, PLACETEXT_RIGHT, NULL, NULL,
  72.      33,  85, 200, 17, (UBYTE *)"Name", NULL, GD_STRING, PLACETEXT_RIGHT, NULL, NULL,
  73.      33, 110, 111, 17, (UBYTE *)"Nameoptions", NULL, GD_CYCLE, PLACETEXT_RIGHT, NULL, NULL,
  74.     133, 145,  26, 17, (UBYTE *)"Show next object", NULL, GD_CHECK, PLACETEXT_RIGHT ,NULL, NULL,
  75.      33,  50, 200, 17, (UBYTE *)"Pulldownspeed", NULL, GD_SLIDER2, PLACETEXT_RIGHT ,NULL, NULL,
  76.      33, 145,  71, 17, (UBYTE *)"Info", NULL, GD_BUTTON1, PLACETEXT_IN ,NULL, NULL,
  77.      33, 170,  71, 17, (UBYTE *)"OK", NULL, GD_BUTTON2, PLACETEXT_IN ,NULL, NULL
  78. };
  79.  
  80. ULONG OptionsGTags[] = {
  81.     (GTSL_Max), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
  82.     (GTST_MaxChars), 20, (TAG_DONE),
  83.     (GTCY_Labels), (ULONG)&CYCLE0Labels[0], (TAG_DONE),
  84.     (GTCB_Checked), TRUE, (TAG_DONE),
  85.     (GTSL_Max), 20, (GTSL_Level), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
  86.     (GA_Disabled), FALSE, (TAG_DONE),
  87.     (TAG_DONE)
  88. };
  89.  
  90.  
  91.  
  92. int OpenOptionsWindow(void)
  93. {
  94.     struct NewGadget  ng;
  95.     struct Gadget    *g = NULL;
  96.     UWORD             lc, tc;
  97.     UWORD             wleft = OptionsLeft, wtop = OptionsTop;
  98.     UWORD             ww, wh = 195;
  99.  
  100.    if (UseLace)
  101.       ww = 337;
  102.    else
  103.       ww= 367;
  104.  
  105.     if ( ! ( g = CreateContext( &OptionsGList )))
  106.         return( 1L );
  107.  
  108.     for( lc = 0, tc = 0; lc < Options_CNT; lc++ ) {
  109.  
  110.         CopyMem((char * )&OptionsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  111.  
  112.         ng.ng_VisualInfo = VisualInfo;
  113.  
  114.         if (UseLace)
  115.            ng.ng_TextAttr   = &helvetica13;
  116.         else
  117.            ng.ng_TextAttr   = &topaz8;
  118.  
  119.         ng.ng_LeftEdge   = ng.ng_LeftEdge;
  120.         ng.ng_TopEdge    = ng.ng_TopEdge+(myscreen->Font->ta_YSize)-10;
  121.         ng.ng_Width      = ng.ng_Width;
  122.         ng.ng_Height     = ng.ng_Height;
  123.  
  124.         OptionsGadgets[ lc ] = g = CreateGadgetA((ULONG)OptionsGTypes[ lc ], g, &ng, ( struct TagItem * )&OptionsGTags[ tc ] );
  125.  
  126.         while( OptionsGTags[ tc ] ) tc += 2;
  127.         tc++;
  128.  
  129.         if ( NOT g )
  130.         return( 2L );
  131.     }
  132.  
  133.     if ( ! ( OptionsWnd = OpenWindowTags( NULL,
  134.                     WA_Left,          wleft,
  135.                     WA_Top,           wtop+(myscreen->Font->ta_YSize)+3,
  136.                     WA_Width,         ww,
  137.                     WA_Height,        wh+(myscreen->Font->ta_YSize),
  138.                     WA_IDCMP,         SLIDERIDCMP|STRINGIDCMP|CYCLEIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW | IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY,
  139.                     WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
  140.                     WA_Gadgets,       OptionsGList,
  141.                     WA_Title,         OptionsWdt,
  142.                     TAG_DONE )))
  143.         return( 4L );
  144.  
  145.     GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER], OptionsWnd, NULL,
  146.                       GTSL_Level, LevelOffset,
  147.                       TAG_END);
  148.     GT_SetGadgetAttrs(OptionsGadgets[GD_STRING], OptionsWnd, NULL,
  149.                       GTST_String, Name,
  150.                       TAG_END);
  151.     GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER2], OptionsWnd, NULL,
  152.                       GTSL_Level, 20-pulldownticks*2,
  153.                       TAG_END);
  154.     GT_SetGadgetAttrs(OptionsGadgets[GD_CHECK], OptionsWnd, NULL,
  155.                       GTCB_Checked, nextteil,
  156.                       TAG_END);
  157.     GT_SetGadgetAttrs(OptionsGadgets[GD_CYCLE], OptionsWnd, NULL,
  158.                       GTCY_Active, !lockname,
  159.                       TAG_END);
  160.     GT_RefreshWindow( OptionsWnd, NULL );
  161.  
  162.     return( 0L );
  163. }
  164.  
  165. void CloseOptionsWindow( void )
  166. {
  167.     if (OptionsWnd) {
  168.         CloseWindow( OptionsWnd );
  169.         OptionsWnd = NULL;
  170.     }
  171.  
  172.     if (OptionsGList) {
  173.         FreeGadgets( OptionsGList );
  174.         OptionsGList = NULL;
  175.     }
  176. }
  177.  
  178.  
  179.  
  180. /*
  181. ** Function to handle a GADGETUP or GADGETDOWN event.  For GadTools gadgets,
  182. ** it is possible to use this function to handle MOUSEMOVEs as well, with
  183. ** little or no work.
  184. */
  185. BOOL handleGadgetEvent(struct Window *win, struct Gadget *gad, UWORD code, struct Gadget *my_gads[])
  186. {
  187.    switch (gad->GadgetID) {
  188.       case GD_SLIDER:
  189.           LevelOffset = code;
  190.           break;
  191.       case GD_SLIDER2:
  192.           pulldownticks = (20-code)/2;
  193.           break;
  194.       case GD_STRING:
  195.           strcpy(Name, ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  196.           break;
  197.       case GD_BUTTON1:
  198.           EasyRequest(NULL, &myES, NULL, PROG_NAME, VERSION, AUTHOR);
  199.           break;
  200.       case GD_BUTTON2:
  201.           return(TRUE);
  202.           break;
  203.       case GD_CYCLE:
  204.           if (code == 0)
  205.              lockname = TRUE;
  206.           else
  207.              lockname = FALSE;
  208.           break;
  209.       case GD_CHECK:
  210.           nextteil = !nextteil;
  211.           break;
  212.    }
  213.    return(FALSE);
  214. }
  215.  
  216.  
  217. /*
  218. ** Standard message handling loop with GadTools message handling functions
  219. ** used (GT_GetIMsg() and GT_ReplyIMsg()).
  220. */
  221. VOID process_window_events(struct Window *mywin, struct Gadget *my_gads[])
  222. {
  223.    struct IntuiMessage *imsg = NULL;
  224.    ULONG                imsgClass;
  225.    UWORD                imsgCode;
  226.    struct Gadget       *gad = NULL;
  227.    BOOL                 terminated = FALSE;
  228.  
  229.    while (!terminated) {
  230.       Wait (1 << mywin->UserPort->mp_SigBit);
  231.  
  232.       while ((!terminated) && (imsg = GT_GetIMsg(mywin->UserPort))) {
  233.          gad = (struct Gadget *)imsg->IAddress;
  234.  
  235.          imsgClass = imsg->Class;
  236.          imsgCode = imsg->Code;
  237.  
  238.          GT_ReplyIMsg(imsg);
  239.  
  240.          switch (imsgClass) {
  241.             case IDCMP_ACTIVEWINDOW:
  242.                ActivateGadget(OptionsGadgets[1], mywin, NULL);
  243.                break;
  244.             case IDCMP_GADGETDOWN:
  245.             case IDCMP_GADGETUP:
  246.                terminated = handleGadgetEvent(mywin, gad, imsgCode, my_gads);
  247.                break;
  248.             case IDCMP_RAWKEY:
  249.                if (imsg->Code == '\x45')
  250.                   terminated = TRUE;
  251.                break;
  252.             case IDCMP_CLOSEWINDOW:
  253.                terminated = TRUE;
  254.                break;
  255.             case IDCMP_REFRESHWINDOW:
  256.                GT_BeginRefresh(mywin);
  257.                GT_EndRefresh(mywin, TRUE);
  258.                break;
  259.          }
  260.       }
  261.    }
  262. }
  263.  
  264.  
  265.  
  266. /*
  267. ** Open all libraries and run.  Clean up when finished or on error..
  268. */
  269. void OpenOptions(WORD winxpos, WORD winypos)
  270. {
  271.    OptionsLeft = winxpos;
  272.    OptionsTop = winypos;
  273.  
  274.    if (UseLace)
  275.       OptionsWidth = 313;
  276.    else
  277.       OptionsWidth = 363;
  278.  
  279.    if (lockname == FALSE)
  280.       strcpy(Name, "");
  281.  
  282.  
  283.    if (OpenOptionsWindow() == 0L) {
  284.       process_window_events(OptionsWnd, OptionsGadgets);
  285.       CloseOptionsWindow();
  286.    }
  287. }
  288.